
// utils/iframe-message.js

/**
 * 接收页面 postMessage 发送的信息
 * Pubsub提供多种类型供订阅，使用方法如下：
 * 1. 需要接收webSocket的地方，import eventsPub from '本文件路径'
 * 2. eventsPub.on(类型, callback)
 *    例：
 *      const receive = data => console.log('eventName', data)
 *      eventsPub.on('eventName', receive)
 * 3.不需要继续接收时调用
 *    eventsPub.remove("eventName", receive) 移除callback
 */

/** 重要: postMessageEvent 中的 type 需提前定义 */
class PubSub {
    list = {};
    constructor(events) {
        this.list = {};
        events.forEach(v => {
            this.list[v] = [];
        });
    }

    on(ev, callback) {
        if (this.list[ev]) {
            this.list[ev].push(callback);
            return true;
        } else {
            return false;
        }
    }

    emit(ev, data) {
        // data拷贝: 防止其他callback修改data
        const dataStr = JSON.stringify(data);
        if (this.list[ev]) {
            this.list[ev].forEach((v) => {
                try {
                    v(JSON.parse(dataStr));
                } catch (err) {
                    console.log("callback error:", err, v);
                }
            });
            return true;
        } else {
            return false;
        }
    }

    remove(ev, callback) {
        if (callback && this.list[ev]) {
            this.list[ev].forEach((v, i) => {
                if (v === callback) {
                    this.list[ev].splice(i, 1);
                }
            });
            return true;
        } else {
            return false;
        }
    }
}

/** 创建消息接收实例 */
const postMessageEvent = ["CESIUM_TO_VUE"]
const eventsPub = new PubSub(postMessageEvent);

/** 接收父页面的消息 */
window.addEventListener("message", function (e) {
    if (e.data?.type) {
        eventsPub.emit(e.data.type, e.data.data)
    }
});

export default eventsPub;

